package com.mdd.pdfgener.controller.tool;

import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.*;
import com.mdd.pdfgener.domain.pdfCollection;
import com.mdd.pdfgener.domain.pdfConfig;
import org.springframework.web.bind.annotation.*;

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 描述：自动生成PDF
 *
 * @author Bowen
 * @date 2020/7/13
 */
@RestController
@RequestMapping("/tool")
public class GeneratePdfController {


    @PostMapping("/generatePdf")
    @ResponseBody
    public String index(@RequestBody pdfCollection pdfconfig ) throws IOException, DocumentException {
        // pdf模板    例如："static/pdftemplate/certificate-tmplet.pdf"
        String pdfLocalUrl = pdfconfig.getPdfLocalUrl();
        if(pdfLocalUrl == null) return "未读取到对应的模板，请检查路径是否有误";
        PdfReader reader = new PdfReader(pdfLocalUrl);
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        /* 将要生成的目标PDF文件名称 */
        PdfStamper ps = new PdfStamper(reader, bos);
        PdfContentByte under = ps.getUnderContent(1);
        /* 使用中文字体 */
        BaseFont bf = BaseFont.createFont("static/fonts/SIMYOU.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        ArrayList<BaseFont> fontList = new ArrayList<BaseFont>();
        fontList.add(bf);
        /* 取出报表模板中的所有字段 */
        AcroFields fields = ps.getAcroFields();
        fields.setSubstitutionFonts(fontList);
        //----------------------------------------------------------------

        Calendar c = Calendar.getInstance();
        // 计算时间-年月日
        c.setTime(new Date());

        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH) + 1;
        int day = c.get(Calendar.DAY_OF_MONTH);
        String activityTimes = year + "年" + month + "月" + day + "日";
        fillData(fields, data(pdfconfig, activityTimes));
//        fillData(fields, data);

        /* 必须要调用这个，否则文档不会生成的 */
        ps.setFormFlattening(true);
        ps.close();
        //生成pdf路径
        //生产环境生成的pdf文件在命名时，使用学生表的id+_+活动id做为文件名，如：certificate_302123_2293811.pdf
        // 路径+文件名 例如：Global.getUploadPath() + activityMember.getStudentId() + ".pdf"
        Date date = new Date();
        String outPutURL = pdfconfig.getOutPutURL();
        if(outPutURL == null) return "存储地址为空，无法保存";
        String outPutPath = outPutURL + "/"+date.getTime() + ".pdf";

        OutputStream fos = new FileOutputStream(outPutPath);
        fos.write(bos.toByteArray());
        fos.flush();
        fos.close();
        bos.close();


        // 同上路径
        File files = new File(outPutPath);
        // 如果需要OSS上传 放开下行
//        String str = OSSUploadUtil.uploadFileN(files, "pdf",activityMember.getStudentKindergartenName()+activityMember.getStudentClassName()+ activityMember.getStudentName());
//        mmap.put("str", str);
//        activityMember.setCertificateUrl(str);
//        activityMemberService.updateActivityMember(activityMember);
        return files.getPath();
    }

    public static void fillData(AcroFields fields, Map<String, String> data) throws IOException, DocumentException {
        for (String key : data.keySet()) {
            String value = data.get(key);
            fields.setField(key, value); // 为字段赋值,注意字段名称是区分大小写的  
        }
    }

    /**
     *     * 填充数据源
     *     * 其中data存放的key值与pdf模板中的文本域值相对应
     *     *
     */
    public static Map<String, String> data(pdfCollection configs, String dateStrings) {

        int nums = (int)((Math.random()*9+1)*1000);
        SimpleDateFormat format = new SimpleDateFormat("yyMMdd");
        String batchno = format.format(new Date());
        Map<String, String> data = new HashMap<String, String>();
        List<pdfConfig> configList = configs.getPdfconfig();
        if(configList == null || configList.size() <= 0){
            data.put("msg","未获取到存储的数据字段");
            return data;
        }

        for (pdfConfig item:configList) {
            String key = item.getName();
            String value = item.getValue();
            data.put(key,value);
        }

//        String yeyname = ikn;//换成幼儿园的名称
//        String xsname = sname;//换成小朋友的名称
//        String dateString = dateStrings;//换成生成奖状的日期
//        data.put("dfds", yeyname);//此处拼接内容为格式要求，不要修改
//        data.put("Tefdsxt3", "测试网页生成");//此处拼接内容为格式要求，不要修改
//        data.put("name", xsname);
//        data.put("date", dateString);
//        data.put("num", "ZWL-"+batchno+nums);
//        data.put("zhi","测试文崩框");
        return data;

    }
}
